#include "../maindef.h"
#include "CBattleVideo.h"
#include "CBattleRules.h"
#include "MsgBattle.pb.h"
#include "CBattleInf.h"

void CBattleVideo::WriteVideo(MsgBattleResult& stMsgBattleRes)
{
    for (int i = 0; i < _astAct.Size(); ++i)
    {
        MsgBattleInfo* pstBattleInfo = stMsgBattleRes.add_battle_infos();
        if (pstBattleInfo)
        {
            for (int j = 0; j < _astAct[i].astFrame.Size(); ++j)
            {
                pstBattleInfo->add_battle_line(_astAct[i].astFrame[j]);
            }
    
            if (_astAct[i].astFrame.Size() >= 2 &&
                _astAct[i].astFrame[0] == BATTLE_VIDEO_CTRL_CIRCLE_END &&
                _astAct[i].astFrame[1] >= MAX_BATTLE_VIDEO_COUNT)
                //传输给前端的战斗录像回合上限
            {
                pstBattleInfo = stMsgBattleRes.add_battle_infos();
                if (pstBattleInfo)
                {
                    pstBattleInfo->add_battle_line(
                        BATTLE_VIDEO_CTRL_BATTLE_END);
                    return;
                }
            }
        }
    }
}

void CBattleVideo::BattleBegin()
{
    CBattleVideoAction& stFrame = GetFrame();
    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CTRL_BATTLE_START);
    CT_BATTLE(("战斗开始"));
}

void CBattleVideo::BattleEnd()
{
    CBattleVideoAction& stFrame = GetFrame();
    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CTRL_BATTLE_END);
    CT_BATTLE(("战斗结束"));
}

void CBattleVideo::CircleBegin(int iRoundNum)
{
    CBattleVideoAction& stFrame = GetFrame();
    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CTRL_CIRCLE_START);
    stFrame.astFrame.AddOneItem(iRoundNum);
    CT_BATTLE(("第(%d)圈开始",iRoundNum));

#if 0
    GroupCmdStart();//byronwei_tmp
    SetCircleBegin(true);//byronwei_tmp
#endif
}

void CBattleVideo::CircleEnd(int iRoundNum)
{
    //GroupCmdStop();//byronwei_tmp

    CBattleVideoAction& stFrame = GetFrame();
    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CTRL_CIRCLE_END);
    stFrame.astFrame.AddOneItem(iRoundNum);
    CT_BATTLE(("第(%d)圈结束",iRoundNum));
}

void CBattleVideo::TurnBegin(int iRoleID)
{
#if 0
    //byronwei_tmp
    if (GetCircleBegin())
    {
        SetCircleBegin(false);
        if (BATTLE_INF->_pstRoles->IsValidRoleID(iRoleID))
        {
            CBattleRole& stBattleRole =
                BATTLE_INF->_pstRoles->GetRole(iRoleID);
            SetLeftTurn(stBattleRole.IsLeft());
        }
    }
    else if (BATTLE_INF->_pstRoles->IsValidRoleID(iRoleID))
    {
        CBattleRole& stBattleRole = BATTLE_INF->_pstRoles->GetRole(iRoleID);
        if (GetLeftTurn() != stBattleRole.IsLeft())
        {
            GroupCmdStop();
            GroupCmdStart();
            SetLeftTurn(stBattleRole.IsLeft());
        }
    }
#endif
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CTRL_ROLE_START);
    stFrame.astFrame.AddOneItem(iRoleID);
    CT_BATTLE(("角色(%d)开始行动",iRoleID));
}

void CBattleVideo::TurnEnd(int iRoleID)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CTRL_ROLE_END);
    stFrame.astFrame.AddOneItem(iRoleID);
    CT_BATTLE(("角色(%d)行动结束",iRoleID));
}

void CBattleVideo::GroupCmdStart()
{
    CBattleVideoAction& stFrame = GetFrame();
    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_GROUP_CMD_START);
    CT_BATTLE(("组合命令功能开启"));
}

void CBattleVideo::GroupCmdStop()
{
    CBattleVideoAction& stFrame = GetFrame();
    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_GROUP_CMD_STOP);
    CT_BATTLE(("组合命令功能关闭"));
}

void CBattleVideo::ModPlayerHP(int iRoleID, int iBloodChg)
{
    if (iBloodChg == 0){ return ; }
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_HP_CHG);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iBloodChg);
    CT_BATTLE(("角色(%d)血量变化(%d)",iRoleID,iBloodChg));
}

void CBattleVideo::BuffExpire(int iRoleID, int iSrcID, int iBuffID, int iIndex)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_EFT_MISS);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iSrcID);
    stFrame.astFrame.AddOneItem(iBuffID);
    //stFrame.astFrame.AddOneItem(iIndex);
}

void CBattleVideo::CastSkill(int iRoleID, int iSkillID, int iTargetType,
        CBattleSkillCastEffect& stFirstEffect,
        CBattleSkillCastEffect& stSecondEffect)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_EXE_SKILL);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iSkillID);
    stFrame.astFrame.AddOneItem(iTargetType);
    if (stSecondEffect._astTargets.Size() > 0)
    {
        //stFrame.astFrame.AddOneItem(stSecondEffect._chTargetType);
        if (stFirstEffect._chTargetFromPos < stSecondEffect._chTargetFromPos)
        {
            stFrame.astFrame.AddOneItem(stFirstEffect._chTargetFromPos);
        }
        else
        {
            stFrame.astFrame.AddOneItem(stSecondEffect._chTargetFromPos);
        }
        if (stFirstEffect._chTargetEndPos > stSecondEffect._chTargetEndPos)
        {
            stFrame.astFrame.AddOneItem(stFirstEffect._chTargetEndPos);
        }
        else
        {
            stFrame.astFrame.AddOneItem(stSecondEffect._chTargetEndPos);
        }
    }
    else
    {
        //stFrame.astFrame.AddOneItem(stFirstEffect._chTargetType);
        stFrame.astFrame.AddOneItem(stFirstEffect._chTargetFromPos);
        stFrame.astFrame.AddOneItem(stFirstEffect._chTargetEndPos);
    }

    for (int i = 0; i < stFirstEffect._astTargets.Size(); ++i)
    {
        CT_BATTLE(("角色(%d)释放技能(%d)目标角色(%d)",
            iRoleID,iSkillID,stFirstEffect._astTargets[i].GetID()));
        stFrame.astFrame.AddOneItem(stFirstEffect._astTargets[i].GetID());
    }
    for (int i = 0; i < stSecondEffect._astTargets.Size(); ++i)
    {
        CT_BATTLE(("角色(%d)释放技能(%d)目标角色(%d)",
            iRoleID,iSkillID,stSecondEffect._astTargets[i].GetID()));
        stFrame.astFrame.AddOneItem(stSecondEffect._astTargets[i].GetID());
    }
}

void CBattleVideo::CastSkillConsume(int iRoleID, int iSkillID, int iUseAnger, int iUseHP)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_SKILL_COST);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iSkillID);
    stFrame.astFrame.AddOneItem(iUseAnger);
    stFrame.astFrame.AddOneItem(iUseHP);
    CT_BATTLE(("角色(%d)释放技能(%d)消耗怒气(%d)消耗生命(%d)",iRoleID,iSkillID,iUseAnger,iUseHP));
}

void CBattleVideo::Move(int iRoleID, int iToGrid)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_MOVE);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iToGrid);
    CT_BATTLE(("角色(%d)移动到格子(%d)",iRoleID,iToGrid));
}

void CBattleVideo::AddBuff(int iRoleID, int iSrcID, int iBuffID, int iTurn,
        int iAddNum)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_ADD_EFT);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iSrcID);
    stFrame.astFrame.AddOneItem(iBuffID);
    stFrame.astFrame.AddOneItem(iTurn);
    stFrame.astFrame.AddOneItem(iAddNum);
}

void CBattleVideo::ModCourage(int iRoleID, int iValue)
{
    if (iValue == 0) { return ; }
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_COURAGE_CHG);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iValue);
}

void CBattleVideo::ModAnger(int iRoleID, int iValue)
{
    if (iValue == 0) { return ; }
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_ANGER_CHG);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iValue);
}

void CBattleVideo::ModShield(int iRoleID, int iValue)
{
    if (iValue == 0) { return ; }
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_SHIELD_CHG);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iValue);
    CT_BATTLE(("角色(%d)护盾效果变化值(%d)",iRoleID,iValue));
}

void CBattleVideo::LostBloodBySkill(int iRoleID, int iStat, int iBlood, int iHitBack, int iPull)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_ATK_DOT);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iStat);
    //血量变化值
    stFrame.astFrame.AddOneItem(iBlood);
    //击退到格子
    stFrame.astFrame.AddOneItem(iHitBack);
    //拖拽到格子
    stFrame.astFrame.AddOneItem(iPull);
    CT_BATTLE(("角色(%d)作为施法目标血量变化(%d)被击飞到格子(%d)被拖拽到格子(%d)",iRoleID,iBlood,iHitBack,iPull));
}

void CBattleVideo::NoCourageTurnEnd(int iRoleID)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_NO_COURAGE);
    stFrame.astFrame.AddOneItem(iRoleID);
    CT_BATTLE(("角色(%d)没有勇气，回合结束",iRoleID));
}

void CBattleVideo::IsSwimTurnEnd(int iRoleID)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_SWIM);
    stFrame.astFrame.AddOneItem(iRoleID);
    CT_BATTLE(("角色(%d)被晕，回合结束",iRoleID));
}

void CBattleVideo::CanNotUseSkill(int iRoleID)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_STOP);
    stFrame.astFrame.AddOneItem(iRoleID);
    CT_BATTLE(("角色(%d)不能释放技能，回合结束",iRoleID));
}

void CBattleVideo::RoleDead(int iRoleID)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_DEAD);
    stFrame.astFrame.AddOneItem(iRoleID);
    CT_BATTLE(("角色(%d)死亡",iRoleID));
}

void CBattleVideo::RoleCourageStat(int iRoleID, int iStat)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_COURAGE_RECV);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iStat);
}

void CBattleVideo::RoleAngerStat(int iRoleID, int iStat)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_ANGER_FULL);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iStat);
}

void CBattleVideo::RoleFallBack(int iRoleID)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_FALL_BACK);
    stFrame.astFrame.AddOneItem(iRoleID);
}

void CBattleVideo::RoleTreasureAct(int iRoleID, int iTreasureID, int iBaseVal,
        int iChgByLvl)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_TREASURE);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iTreasureID);
    stFrame.astFrame.AddOneItem(iBaseVal);
    stFrame.astFrame.AddOneItem(iChgByLvl);
}

void CBattleVideo::RoleWaitTime(int iRoleID, int iMsec)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_ROLE_WAIT);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iMsec);
}

void CBattleVideo::RoleMountAct(int iRoleID, int iMountID, int iBaseVal,
        int iChgByLvl)
{
    CBattleVideoAction& stFrame = GetFrame();

    stFrame.astFrame.AddOneItem(BATTLE_VIDEO_CONT_MOUNT);
    stFrame.astFrame.AddOneItem(iRoleID);
    stFrame.astFrame.AddOneItem(iMountID);
    stFrame.astFrame.AddOneItem(iBaseVal);
    stFrame.astFrame.AddOneItem(iChgByLvl);
}

